# 局部作用域
def my_func1():
    # 局部变量
    a = 1
    print(a)

my_func1()
try:
    print(a)
except NameError as e:
    print("局部变量在函数外部无法访问")

print("=" * 50)
# 全局作用域
# 在函数外部定义全局变量
name = "张三"
def my_func2():
    # 访问全局部量name
    print(name)

my_func2()
# 访问全局变量name
print(name)
print("=" * 50)

# global关键字
# 函数外部定义全局变量
counter = 0
def increment():
    global counter
    counter += 1    # 修改全局变量counter
    print(counter)  # 1

increment()
print(counter)  # 1

print("=" * 50)
# 嵌套作用域（闭包）
# 闭包：函数嵌套定义的函数，内层函数可以访问外层函数的变量
def outer_func():
    outer_var = "haha"

    def inner_func():
        # 内层函数可以访问外层函数的变量
        # outer_var = "hehe"  # 这表示直接修改了一个内层变量而不是修改外层变量
        # nonlocal,
        nonlocal outer_var
        # 对外层变量进行修改
        outer_var = "hehe"
        print(outer_var)    # hehe

    inner_func()
    print(outer_var)    # hehe

outer_func()
